#include "comm.hpp"
int main()
{
    vector<subEp> subs;
    // 1.将所有的方法加载到方法表中。
    vector<fun_t> funcMap;
    loadTask(&funcMap);
    // 2.创建命名管道，并创建对应的子进程
    string s = PATH;
    for (int i = 0; i < PROCESS_NUM; ++i)
    {
        // 创建命名管道
        string namePipe = s + to_string(i);
        umask(0);
        cout << "**************" << getpid() << endl;
        int n = mkfifo(namePipe.c_str(), 0666);
        assert(n == 0);
        // 创建子进程
        pid_t id = fork();
        if (id == 0)
        {
            //以读的方式连接管道，形成通信
            cout << getpid() << endl;
            int rfd = open(namePipe.c_str(), O_RDONLY);
            if (rfd < 0)
                cout << strerror(errno) << endl;
            while (1)
            {
                ssize_t commandCode = recvTask(rfd);
                if (commandCode >= 0 && commandCode < funcMap.size())
                {
                    funcMap[commandCode]();
                }
                else if (commandCode < 0)
                {
                    cout << strerror(errno) << endl;
                    break;
                }
                else
                {
                    //写入端退出后，读取端也会自动退出，OS自动操作。
                    cout << "client quit! me too!" << endl;
                    break;
                }
            }
            //注意子进程跳出循环后就退出了，
            close(rfd);
            exit(0);
        }

        subEp sub(namePipe, id);    
        subs.push_back(sub);

        sleep(1);   
    }
    //等待子进程，防止僵尸进程
    waitProcess(subs);
    //释放管道资源
    removeFifo(subs);

    return 0;
}